home *** CD-ROM | disk | FTP | other *** search
- {
- > I've asked this question before, in several message areas, but
- > have still to get an answer.. I need to be able to get the size
- > and colors from a JPEG/JFIF image file.. Nothing more, nothing
- > less... Structures would do, regardless of language (C, Asm,
- > Pas, Basic). Anyone?
-
- Here it is (not fully tested, only extracts height and width of the picture!)
- }
-
- Procedure GetJpegInfo(FName : String; VAR IsJpeg: Boolean; VAR Height,
- Width : Word);
-
- {Checks if file FName is a (true) JPEG/JFIF file and extracts
- height and width (in pixels) of the picture}
- Const
- JFIFS : String[4] = #$FF + #$D8 + #$FF + #$E0;
- {JFIF marker: $FF SOI $FF App0}
-
- Var F : File;
- ReadS : String;
- ARead : Word;
- Count : Integer;
-
- begin
- Assign(F,FName);
- Reset(F,1);
- Blockread(F, ReadS[1], 255, Aread);
- ReadS[0] := Chr(Aread);
- Close(F);
-
- IsJpeg := FALSE;
-
- {Search for JFIF marker in first 255 bytes of the file.
- If NOT found, then you can safely assume the file isn't
- a (real) JPEG/JFIF file}
-
- if Pos(JFIFS, ReadS) > 0 then
- begin
- If (Copy(ReadS, Pos(JFIFS,ReadS)+Length(JFIFS)+2,5) = 'JFIF'+#0) then
- begin
-
- {We have a JPEG/JFIF File!}
-
- IsJpeg := TRUE;
-
- {Search for SOF marker}
-
- Count := 0;
- Repeat
- inc(Count);
- Until (Count > length(ReadS)) OR
- (ReadS[Count] in [#192..#207]);
- if Count <= Length(ReadS) then
- begin
- { ReadS[Count] = first SOF marker
- Count + 1 = length high byte \ length of APP0 data!
- Count + 2 = length low byte /
- Count + 3 = data precision - colors (?)
- Count + 4 = height high byte \ heigth of picture
- Count + 5 = height low byte /
- Count + 6 = width high byte \ width of picture
- Count + 7 = width low byte /
- }
- Height := Word(Ord(ReadS[Count+4])*256) + Ord(ReadS[Count+5]);
- Width := Word(Ord(ReadS[Count+6])*256) + ord(ReadS[Count+7]);
- end;
- end;
- end;
- end;
-